/**
  ******************************************************************************
  * @file    pid.h
  * @author  FSF
  * @date    2019/9/18
  * @brief   pid面向对象风格实现
  ******************************************************************************
  * @attent  
  * @myNote  
  ******************************************************************************
  */

#ifndef __PID_H
#define __PID_H

#include "stdint.h"
#include "stdio.h"

typedef struct _PID_t
{
    float p;
    float i;
    float d;

    float target_value;
    float current_value;
    float err;
    float last_err;
    float i_value;  // 积分值
    float integral_limit;  // 抗积分饱和限制

    float max_output;  // 输出上限

    float output;

    uint8_t first_time_flag;    // 第一次计算时不要D项
    
    void (*f_ParamInit)  // 结构体内的函数指针变量，赋函数指针后可进行调用
    (
       struct _PID_t *pid,  // 该类型结构体指针
       float p,
       float i,
       float d,
       float integral_limit,
       float max_output
    );

    void (*f_Reset)
    (
        struct _PID_t *pid,
        float p,
        float i,
        float d,
        float integral_limit,
        float max_output
    );

    void (*f_Calculate)
    (
        struct _PID_t *pid,
        float current_value
    );
}PID_t;

void PID_StructInit(PID_t *pid);

#endif
